//package com.tjetc._3final;
//
//public class _1Final {
//    public static void main(String[] args) {
//        /*
//            final关键字: 最终的，最后的
//            表示不能修改了
//            能用在哪里：
//                1.修饰类: 当不希望类被继承时，可以⽤final修饰
//                2.属性: 当不希望类的的某个属性的值被修改可以⽤final修饰 (基本数据类型和引用数据类型)
//                3.⽅法: 当不希望⽗类的某个⽅法被⼦类覆盖/重写(override)时，可以⽤final关键字修饰
//                4.局部变量: 当不希望某个局部变量被修改，可以使⽤final修饰 (基本数据类型和引用数据类型)
//
//         */
//
//        // 后续会讲 内部类的调用
////        Tool.E.f();
//        Tool.f();
//
//    }
//}
//
//final class A {
//    // 成员属性被final修饰 是不允许使用默认值，因为我们定义变量的目的是希望我们自己设置一个不变的值，否则每次定义出来的变量只能使用默认值
//    final int a = 1;
//    final int b;
//
//    {
//        b = 1;
//    }
//
//    final C c = new C();
//
//
//    public void f() {
//        // Cannot assign(指定) a value to final variable 'a'
////        a = 2;
//
////        c = new C();
//        c.a = 1; // 对于引用数据类型来说，地址的值不能改变 对象中的数据是能修改的
//        c.d = new D();
//    }
//
//
//    public void f1(final int a){
//        final int b;
//        b = 1;
////        b = 2;
//    }
//}
//
//// Cannot inherit from final class
////class B extends A {
////
////}
//
//
//class C {
//    int a = 1;
//    D d = new D();
//    // 如果类被final修饰说明类不能被继承，也就不用final来修饰方法了，因为没有继承了
//    public final void f(){}
//}
//
//class D extends C{
////    @Override
////    public void f() {
////
////    }
//}
//
//
//
//
//
//// 拓展：工具类的两个特征：（1）构造方法私有化 （2）使用final修饰不能被继承
//
//// 代表工具类
//final class Tool {
//    private Tool(){}
//    public static void f(){
//        System.out.println("使用榔头");
//    }
//    // 嵌套类 可以实现继承
////    static class E extends Tool {
////
////        public static void f(){
////            System.out.println("使用锤子");
////        }
////    }
//}
//
//// 由于父类对象构造器私有化导致子类继承父类无法创建父类
//// 这种只是我们表面上看到的不可以，但是可以通过非法手段 通过字节码的操作，绕过父类的私有构造器 来进行继承来创建子类对象 JVM
////class F extends Tool {
////
////}
//
//
//
//
//
//
